// 立即执行函数 创建出一个作用域 解决ts同一目录下文件内定义变量不能重复的问题
(function () {
  // 1.描述一个对象的类型
  type myType = {
    name: string,
    age: number
  };

  // 使用
  const obj: myType = {
    name: "小陈",
    age: 19
  }
  console.log(obj);

  // 2.通过接口interface来定义一个类结构 应该包含哪些属性和方法
  interface myInterface {
    name: string,
    age: number
  };

  const obj2: myInterface = {
    name: "小陈2",
    age: 20
  }
  console.log(obj2);


  // 3.通过上面的例子看 类型定义与接口定义看起来差不多 其实不然 type 不能重复定义 如下
  type newType = string;
  // type newType = string; // 提示"标识符"重复

  // 没问题
  interface newInterface { name: string };
  interface newInterface { age: number };

  // 那重复声明接口使用时怎么使用呢?
  // 把两个接口定义的结构进行合并 如下
  const obj3: newInterface = {
    name: "Mr.chen",
    age: 19
  };


  // 4.接口同样可以用于定义类 如下
  interface classInterface {
    name: string;
    age: number;
    sayHi(): void;
  };

  // implements
  class MyClass implements myInterface {
    name: string;
    age: number;

    constructor(name: string, age: number) {
      this.name = name;
      this.age = age;
    }

    sayHi() {
      console.log("Hi 大家好");
    }
  }

  // 总结: 如果我们光从代码层次上看的话 接口反而让我们的代码显得更加复杂了 
  // 其实接口就是一种规范 一种限制 你满足我的这种规范 那么你就能去做我规定的某些事情
  // 很多东西如果没有规则制度就会显得杂乱无章 程序也是如此
})()